/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.uca.sisbec.helpers;

import com.uca.sisbec.beans.CodeAndName;
import com.uca.sisbec.commons.Utils;
import com.uca.sisbec.forms.LoginForm;
import com.uca.sisbec.mapping.Modulo;
import com.uca.sisbec.mapping.Usuario;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Juank
 */
public class LoginHelper {
    private Session session;
    
    public LoginHelper(Session session) {
        this.session = session;
    }

    public Usuario getUser(LoginForm lf) {
        Query query = session.createQuery("from Usuario where alias = :v_alias");
        query.setString("v_alias", lf.getUser());
        return (Usuario) query.uniqueResult();
    }

    public String getMenuXRol2(Integer idRol) {
        String menu = "";
        Modulo modulo = null;
        Modulo parent = null;
        String padre = "0";
        String hql = "from Modulo m "
                + "where m.idModulo in "
                + "(select mr.id.idModulo from ModuloXRol mr "
                + "where mr.id.idRol = :v_idRol) "
                + "and m.opcPrincipal is not null "
                + "and m.estado = 'A' "
                + "order by m.opcPrincipal, m.ordenMenu ";
        Query query = session.createQuery(hql);
        query.setInteger("v_idRol", idRol);
        List<Modulo> modList = new ArrayList<Modulo>(query.list());
        if (modList == null || modList.isEmpty())
            return "";
        for (Iterator iter = modList.iterator(); iter.hasNext();){
            modulo = (Modulo) iter.next();
            if (!padre.equals(modulo.getOpcPrincipal())){
                parent = getParentModulo(modulo.getOpcPrincipal());
                if (!menu.equals(""))
                    menu += "</ul></li>";
                menu += "<li>" + getBuildOption(parent.getModulo(), parent.getAccion()) + "<ul>";
                padre = modulo.getOpcPrincipal();
            }
            menu += "<li>" + getBuildOption(modulo.getModulo(), modulo.getAccion()) + "</li>";
        }
        /* cerrar sesion o salir, esta opcion no esta como menu */
        menu += "</ul></li>";
        menu += "<li>" + getBuildOption("Salir", "signin.jsa?cmd=logoffUser") + "<ul>";
        menu = "<ul id=\"nav\">" + menu + "</ul></li></ul>";
        return menu;
    }

    public String getMenuXRol(Integer idRol) {
        String menu = "";
        String hql = "";
        Query query;
        Modulo parent = null;
        List<CodeAndName> modulos = getParentList();
        for (int i = 0; i < modulos.size(); i++){
            hql = "from Modulo m "
                + "where m.idModulo in "
                + "(select mr.id.idModulo from ModuloXRol mr "
                + "where mr.id.idRol = :v_idRol) "
                + "and m.opcPrincipal = :v_opcPrinc "
                + "and m.estado = 'A' "
                + "order by m.opcPrincipal, m.ordenMenu ";
            query = session.createQuery(hql);
            query.setInteger("v_idRol", idRol);
            query.setString("v_opcPrinc", Integer.toString(modulos.get(i).getCodigo()));
            List<Modulo> opciones = new ArrayList<Modulo>(query.list());
            if (!(opciones == null || opciones.isEmpty())){
                parent = getParentModulo(Integer.toString(modulos.get(i).getCodigo()));
                if (!menu.equals(""))
                    menu += "</ul></li>";
                menu += "<li>" + getBuildOption(parent.getModulo(), parent.getAccion()) + "<ul>";
                for (int j = 0; j < opciones.size(); j++)
                    menu += "<li>" + getBuildOption(opciones.get(j).getModulo(), opciones.get(j).getAccion()) + "</li>";
            }
        }
        /* cerrar sesion o salir, esta opcion no esta como menu */
        menu += "</ul></li>";
        menu += "<li>" + getBuildOption("Salir", "signin.jsa?cmd=logoffUser") + "<ul>";
        menu = "<ul id=\"nav\">" + menu + "</ul></li></ul>";
        return menu;
    }
    
    private String getBuildOption(String nombre, String accion){
        String option = "<a href=\"";
        option += Utils.isNullOrEmpty(accion) ? "#" : "./" + accion;
        option += "\">";
        option += nombre;
        option += "</a>";
        return option;
    }

    private Modulo getParentModulo(String opcPrincipal) {
        Query query = session.createQuery("from Modulo where idModulo = :v_idModulo");
        query.setString("v_idModulo", opcPrincipal);
        return (Modulo) query.uniqueResult();
    }
    
    private List<CodeAndName> getParentList() {
        String hql = "select new com.uca.sisbec.beans.CodeAndName("
                + "idModulo, modulo) "
                + "from Modulo "
                + "where opcPrincipal is null and estado = 'A' "
                + "order by ordenMenu";
        Query query = session.createQuery(hql);
        List<CodeAndName> moduloList = new ArrayList<CodeAndName>(query.list());
        return moduloList;
    }

    public String getMenuXRolBecario(Integer idRol) {
        String menu = "";
        String hql = "from Modulo m "
                + "where m.idModulo in "
                + "(select mr.id.idModulo from ModuloXRol mr "
                + "where mr.id.idRol = :v_idRol) "
                + "and m.opcPrincipal = :v_opcPrinc "
                + "and m.estado = 'A' "
                + "order by m.opcPrincipal, m.ordenMenu ";
        Query query = session.createQuery(hql);
        query.setInteger("v_idRol", idRol);
        query.setString("v_opcPrinc", "8");
        List<Modulo> opciones = new ArrayList<Modulo>(query.list());
        if (!(opciones == null || opciones.isEmpty())){
            for (int j = 0; j < opciones.size(); j++)
                //menu += "<li class=\"ui-state-default ui-corner-top\">"
                menu += "<h3 class=\"ui-widget\">"
                        + getBuildOptionBecario(opciones.get(j).getModulo(), opciones.get(j).getAccion())
                        + "</h3>"
                        + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
                        + opciones.get(j).getDescripcion() + "<br />";
        }
        menu = "<div align=\"left\">"
                + menu
                + "</div>";
        return menu;
    }

    private String getBuildOptionBecario(String modulo, String accion) {
        String option = "<a href=\"";
        option += Utils.isNullOrEmpty(accion) ? "#" : "./" + accion;
        option += "\">";
        option += modulo;
        option += "</a>";
        return option;
    }
}
